/**
 * @file query_builder.h
 * @brief 查询构建器 - 流式SQL构建
 */

#ifndef KWDB_QUERY_BUILDER_H
#define KWDB_QUERY_BUILDER_H

#include "query_result.h"

#include <string>
#include <vector>
#include <map>
#include <future>

namespace kwdb {

// 前向声明
class KWDBClient;

/**
 * @brief 查询构建器
 * 
 * 提供流式SQL查询构建功能：
 * - SELECT子句构建
 * - FROM子句构建
 * - WHERE条件构建
 * - ORDER BY排序
 * - LIMIT限制
 * - 参数化查询
 */
class QueryBuilder {
public:
    /**
     * @brief 构造函数
     * @param client KWDB客户端
     */
    explicit QueryBuilder(KWDBClient& client);
    
    /**
     * @brief 添加SELECT字段
     * @param columns 列名列表
     * @return QueryBuilder引用（支持链式调用）
     */
    QueryBuilder& select(const std::vector<std::string>& columns);
    
    /**
     * @brief 添加SELECT字段（单个）
     * @param column 列名
     * @return QueryBuilder引用（支持链式调用）
     */
    QueryBuilder& select(const std::string& column);
    
    /**
     * @brief 添加SELECT字段（多个）
     * @param column1 列名1
     * @param column2 列名2
     * @param columns 更多列名
     * @return QueryBuilder引用（支持链式调用）
     */
    template<typename... Args>
    QueryBuilder& select(const std::string& column1, const std::string& column2, Args... columns);
    
    /**
     * @brief 设置FROM表名
     * @param table 表名
     * @return QueryBuilder引用（支持链式调用）
     */
    QueryBuilder& from(const std::string& table);
    
    /**
     * @brief 添加WHERE条件
     * @param condition 条件字符串
     * @return QueryBuilder引用（支持链式调用）
     */
    QueryBuilder& where(const std::string& condition);
    
    /**
     * @brief 添加AND条件
     * @param condition 条件字符串
     * @return QueryBuilder引用（支持链式调用）
     */
    QueryBuilder& andWhere(const std::string& condition);
    
    /**
     * @brief 添加OR条件
     * @param condition 条件字符串
     * @return QueryBuilder引用（支持链式调用）
     */
    QueryBuilder& orWhere(const std::string& condition);
    
    /**
     * @brief 添加ORDER BY排序
     * @param column 排序列
     * @param direction 排序方向（ASC/DESC）
     * @return QueryBuilder引用（支持链式调用）
     */
    QueryBuilder& orderBy(const std::string& column, const std::string& direction = "ASC");
    
    /**
     * @brief 添加LIMIT限制
     * @param limit 限制数量
     * @return QueryBuilder引用（支持链式调用）
     */
    QueryBuilder& limit(int limit);
    
    /**
     * @brief 添加OFFSET偏移
     * @param offset 偏移量
     * @return QueryBuilder引用（支持链式调用）
     */
    QueryBuilder& offset(int offset);
    
    /**
     * @brief 添加参数
     * @param key 参数键
     * @param value 参数值
     * @return QueryBuilder引用（支持链式调用）
     */
    QueryBuilder& param(const std::string& key, const std::string& value);
    
    /**
     * @brief 执行查询
     * @return 查询结果
     * @throws KWDBException 查询异常
     */
    QueryResult execute();
    
    /**
     * @brief 异步执行查询
     * @return std::future<QueryResult>
     */
    std::future<QueryResult> executeAsync();
    
    /**
     * @brief 获取构建的SQL语句
     * @return SQL语句
     */
    std::string toSql() const;
    
    /**
     * @brief 重置构建器
     * @return QueryBuilder引用（支持链式调用）
     */
    QueryBuilder& reset();

private:
    KWDBClient& client_;
    
    // SQL构建组件
    std::vector<std::string> selectColumns_;
    std::string fromTable_;
    std::vector<std::string> whereConditions_;
    std::vector<std::pair<std::string, std::string>> orderByClauses_;
    int limitValue_;
    int offsetValue_;
    std::map<std::string, std::string> parameters_;
    
    /**
     * @brief 构建WHERE子句
     * @return WHERE子句字符串
     */
    std::string buildWhereClause() const;
    
    /**
     * @brief 构建ORDER BY子句
     * @return ORDER BY子句字符串
     */
    std::string buildOrderByClause() const;
    
    /**
     * @brief 构建LIMIT子句
     * @return LIMIT子句字符串
     */
    std::string buildLimitClause() const;
    
    /**
     * @brief 转义SQL字符串
     * @param str 原始字符串
     * @return 转义后的字符串
     */
    std::string escapeSqlString(const std::string& str) const;
};

// 模板函数实现
template<typename... Args>
QueryBuilder& QueryBuilder::select(const std::string& column1, const std::string& column2, Args... columns) {
    selectColumns_.push_back(column1);
    selectColumns_.push_back(column2);
    selectColumns_.insert(selectColumns_.end(), {columns...});
    return *this;
}

} // namespace kwdb

#endif // KWDB_QUERY_BUILDER_H
